#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct node
{
	int d,v,a;
}c[N];
bool cmp(queue<int> a,queue<int> b)
{
	return a.size()<b.size();
}
queue<int> g[N];
int dis[N*10],cf[N*10],dt[N];
int main()
{
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		memset(dis,0,sizeof(dis));
		memset(cf,0,sizeof(cf));
		memset(c,0,sizeof(c));
		int cnt=0;
		int n,m,l,vm;
		cin>>n>>m>>l>>vm;
		for(int i=1;i<=n;i++)
		{
			cin>>c[i].d>>c[i].v>>c[i].a;
		}
		for(int i=1;i<=m;i++)
		{
			cin>>dt[i];
		}
		for(int i=1;i<=n;i++)
		{
			if(c[i].a==0)
			{
				if(c[i].v>vm)
				{
					cf[c[i].d]++;
					cf[l+1]--;
					bool flag=false;
					for(int j=1;j<=m;j++)
					{
						if(dt[j]<=l&&dt[j]>=c[i].d)
						{
							g[i].push(dt[j]);
							flag=true;
						}
					}
					if(flag)cnt++;
				}
			}
			else
			{
				if(c[i].a>0)
				{
					if(c[i].v>vm)
					{
						cf[c[i].d]++;
						cf[l+1]--;
						bool flag=false;
						for(int j=1;j<=m;j++)
						{
							if(dt[j]<=l&&dt[j]>=c[i].d)
							{
								g[i].push(dt[j]);
								flag=true;
							}
						}
						if(flag)cnt++;
					}
					else if(c[i].v==vm)
					{
						cf[c[i].d+1]++;
						cf[l+1]--;
						bool flag=false;
						for(int j=1;j<=m;j++)
						{
							if(dt[j]<=l&&dt[j]>=c[i].d+1)
							{
								g[i].push(dt[j]);
								flag=true;
							}
						}
						if(flag)cnt++;
					}
					else
					{
						double x=(vm*vm-c[i].v*c[i].v)*1.0/(2*c[i].a);
						if(c[i].d+ceil(x)<=l)
						{
							cf[c[i].d+int(ceil(x))+1]++;
							cf[l+1]--;
							bool flag=false;
							for(int j=1;j<=m;j++)
							{
								if(dt[j]<=l&&dt[j]>=c[i].d+int(ceil(x))+1)
								{
									g[i].push(dt[j]);
									flag=true;
								}
							}
							if(flag)cnt++;
						}
					}
				}
				else
				{
					if(c[i].v>vm)
					{
						double x=(vm*vm-c[i].v*c[i].v)*1.0/(2*c[i].a);
						cf[c[i].d]++;
						if(c[i].d+floor(x)<=l)
						{	
							if(floor(x)==x)cf[c[i].d+int(floor(x))]--;
							else cf[c[i].d+int(floor(x))+1]--;
							bool flag=false;
							for(int j=1;j<=m;j++)
							{
								if(dt[j]<=c[i].d+int(floor(x))&&dt[j]>=c[i].d)
								{
									g[i].push(dt[j]);
									flag=true;
								}
							}
							if(flag)cnt++;
						}
						else
						{
							cf[l+1]--;
							bool flag=false;
							for(int j=1;j<=m;j++)
							{
								if(dt[j]<=l&&dt[j]>=c[i].d)
								{
									g[i].push(dt[j]);
									flag=true;
								}
							}
							if(flag)cnt++;
						}
					}
				}
			}
		}
		cout<<cnt<<endl;
		cout<<cnt;
	}
	return 0;
}
